home *** CD-ROM | disk | FTP | other *** search
/ Suzy B Software 2 / Suzy B Software CD-ROM 2 (1994).iso / extras / programm / gemfsc20 / gemfsc20.lzh / EXAMPLES / FORMDEMO / FORMDEMO.C next >
C/C++ Source or Header  |  1993-03-27  |  15KB  |  528 lines

  1. /**************************************************************************
  2.  *
  3.  *************************************************************************/
  4.  
  5. #include <osbind.h>
  6. #include <gemfast.h>
  7. #include <exterror.h>
  8. #include <stdlib.h>
  9. #include "formdemo.h"
  10.  
  11. #ifndef NULL
  12.   #define NULL 0L
  13. #endif
  14.  
  15. #ifndef TRUE
  16.   #define TRUE  1
  17.   #define FALSE 0
  18. #endif
  19.  
  20. /*-------------------------------------------------------------------------
  21.  * Error messages...
  22.  *-----------------------------------------------------------------------*/
  23.  
  24. #define Err_unknown     -300
  25. #define Err_demo        -301
  26.  
  27. static _Err_tab custom_messages[] = {
  28.     {Err_unknown, "(Cause of error unknown)"},
  29.     {Err_demo,    "This is a custom error message for\n"
  30.                   "the forms demo. It comes from the\n"
  31.                   "the custom message table."},
  32. };
  33.  
  34. static char xform_error[] = "Can't transform buttons for %s demo.\n";
  35. static char scroll_error[] = "Can't transform text scroller object.\n";
  36. static char nslide_error[] = "Can't transform numeric slider object.\n";
  37.  
  38.  
  39. /*-------------------------------------------------------------------------
  40.  * Miscellanious text messages for the demos...
  41.  *-----------------------------------------------------------------------*/
  42.  
  43. static char menu_title_string[] = "GemFast v1.8 Forms/Dialog Demo";
  44.  
  45. static char version_msg[] =
  46.             "\n"
  47.     "\x7F"  "GemFast v1.8 Forms Demo\n"
  48.     "\x7F"  "Public Domain 04/92 By Ian Lepore\n"
  49.             "\n"
  50.     ;
  51.  
  52.  
  53. static char qtext_msg[] =
  54.     "\x7F" "Demo of frm_qtext()\n"
  55.             "\n"
  56.             "This is some formatted text in a box.\n"
  57.             "Below are 4 random numbers, one per\n"
  58.             "line, each one centered...\n"
  59.             "\n"
  60.     "\x7F"  "%d\n"
  61.     "\x7F"  "%d\n"
  62.     "\x7F"  "%d\n"
  63.     "\x7F"  "%d\n"
  64.     ;
  65.  
  66. static char qchoice_buttons[] =
  67.     "Go For It\n"
  68.     "Don't Do It\n"
  69.     "Maybe\n"
  70.     "Vote On It\n"
  71.     "Punt"
  72.     ;
  73.  
  74. static char qchoice_msg[] =
  75.     "\x7F"  "Demo of frm_qchoice()\n"
  76.             "\n"
  77.     "\x7F"  "Listed below are some buttons that\n"
  78.     "\x7F"  "might represents choices the user\n"
  79.     "\x7F"  "could make at this point.\n"
  80.             "\n"
  81.     ;
  82.  
  83. static char qmenu_title[] = " Demo of frm_qmenu() ";
  84.  
  85. static char qmenu_items[] =
  86.     "Cue CAMBOT Still Store\n"
  87.     "Invention Exchange\n"
  88.     "Cut to the Chase\n"
  89.     "Discuss Plot Point\n"
  90.     "Commercial Sign\n"
  91.     "Closing Credits\n"
  92.     ;
  93.  
  94. static char mustsel_od_msg[] =
  95.     "\x7F"  "You must select one\n"
  96.     "\x7F"  "of these buttons."
  97.     ;
  98.  
  99. static char mustsel_in_msg[] =
  100.     "\x7F"  "You must select one or\n"
  101.     "\x7F"  "more of these buttons."
  102.     ;
  103.  
  104. static char mustenter_fn_msg[] =
  105.         "Filename is required."
  106.         ;
  107.  
  108. static char track_msg[] = "Track: %-2d  Side %d";
  109.  
  110. static char progress_msg[] =
  111.     "\x7F"  "Demo of frm_progress()\n"
  112.             "\n"
  113.             "Let's pretend that we're going to do something to\n"
  114.             "all %d tracks of a floppy disk.  This is an example\n"
  115.             "of what a progress dialog might look like.\n"
  116.             "\n"
  117.             "Please note that this demo does NOT touch your disks!\n"
  118.             "\n"
  119.     "\x7F"  "\n" /* track/side message goes on this (last) line */
  120.     ;
  121.  
  122.  
  123. static char *scrolldata[] = {
  124.     "Line 1",
  125.     "Line 2",
  126.     "Line 3",
  127.     "Line 4",
  128.     "Line 5",
  129.     "Line 6",
  130.     "Line 7",
  131.     "Line 8",
  132.     "Line 9",
  133.     "Line 10",
  134.     "Line 11",
  135.     "Line 12",
  136.     "Line 13",
  137.     "Line 14",
  138.     "Line 15",
  139.     "Line 16",
  140.     "Line 17",
  141.     "Line 18",
  142.     "Line 19",
  143.     "Line 20",
  144.     "Line 21",
  145.     "Line 22",
  146.     "Line 23",
  147.     "Line 24",
  148.     "Line 25",
  149.     "Line 26",
  150.     "Line 27",
  151.     "Line 28",
  152.     "Line 29",
  153.     "Line 30",
  154.     "Line 30 is a very long line, too long for the scroll box just for testing",
  155.     "Line 31",
  156.     "Line 32",
  157.     "Line 33",
  158.     "Line 34",
  159.     "Line 35",
  160.     "Line 36",
  161.     "Line 37",
  162.     "Line 38",
  163.     "Line 39",
  164.     "Line 40",
  165.     NULL
  166. };
  167.  
  168. /*-------------------------------------------------------------------------
  169.  * RSC-related data...
  170.  *-----------------------------------------------------------------------*/
  171.  
  172. #define RSRCNAME "formdemo.rsc"
  173.  
  174. OBJECT  *maintree;
  175. OBJECT  *defltree;
  176. OBJECT  *cbtntree;
  177. OBJECT  *rbtntree;
  178. OBJECT  *movetree;
  179. OBJECT  *flagtree;
  180. OBJECT  *desktree;
  181. OBJECT  *menutree;
  182. OBJECT  *scrltree;
  183. OBJECT  *nslitree;
  184.  
  185. /*-------------------------------------------------------------------------
  186.  * prg_exit - Free GEM resources and terminate program.
  187.  *-----------------------------------------------------------------------*/
  188.  
  189. void prg_exit()
  190. {
  191.     rsrc_free();
  192.     appl_exit();
  193.     Pterm(0);
  194. }
  195.  
  196. /*-------------------------------------------------------------------------
  197.  * prg_init - Init GEM resources and our dialog handling stuff.
  198.  *-----------------------------------------------------------------------*/
  199.  
  200. void prg_init()
  201. {
  202.     int status;
  203.  
  204.     exterrset(custom_messages, TRUE);
  205.  
  206.     appl_init();
  207.  
  208.     frm_enableblit();
  209.     frm_defaults(FRM_CENTER|FRM_MOUSEARROW|FRM_USEBLIT|FRM_MOVEABLE);
  210.  
  211.     if (!rsrc_load(RSRCNAME)) {
  212.         frm_error(Err_unknown, "Fatal", "Can't load resource file!\n");
  213.         prg_exit();
  214.     }
  215.  
  216.     rsc_gtrees(MAINTREE, &maintree,
  217.                MOVETREE, &movetree,
  218.                DEFLTREE, &defltree,
  219.                CBTNTREE, &cbtntree,
  220.                RBTNTREE, &rbtntree,
  221.                FLAGTREE, &flagtree,
  222.                DESKTREE, &desktree,
  223.                MENUTREE, &menutree,
  224.                SCRLTREE, &scrltree,
  225.                NSLITREE, &nslitree,
  226.                -1);
  227.  
  228.     frm_mkmoveable(movetree, MOVEBAR);
  229.  
  230.     if (0 != (status = rsc_cubuttons(cbtntree))) {
  231.         frm_qerror(status, xform_error, "CUA");
  232.     }
  233.  
  234.     if (0 != (status = rsc_rrbuttons(rbtntree))) {
  235.         frm_qerror(status, xform_error,  "RR");
  236.     }
  237.  
  238.     if (0 != (status = obj_make_tscroll(scrltree, SCRLBOX1, SCRLTXCS))) {
  239.         frm_qerror(status, scroll_error);
  240.     } else {
  241.         obj_set_tscroll(scrltree, SCRLBOX1, scrolldata, -1, -1, -1);
  242.     }
  243.  
  244.     if (0 != (status = obj_make_nslide(nslitree, NSLISLID, NO_OBJECT, 0L, 400000L))) {
  245.         frm_qerror(status, nslide_error);
  246.     }
  247.  
  248.     graf_mouse(THIN_CROSS, NULL);
  249. }
  250.  
  251. /*-------------------------------------------------------------------------
  252.  * demo_frm_eflag - Demo the dialog error flagging system.
  253.  *-----------------------------------------------------------------------*/
  254.  
  255. static void demo_frm_eflag()
  256. {
  257.     int     selection;
  258.     char    *edittext;
  259.  
  260.     rsc_gstrings(flagtree, FLAGTEIF, &edittext, -1);
  261.     *edittext = 0;
  262.  
  263.     frm_dialog(FRM_DSTART|FRM_DDRAW, flagtree, 0);
  264.  
  265.     do  {
  266.         selection = frm_dialog(FRM_DDO, flagtree, FLAGTEIF);
  267.         switch (selection) {
  268.           case FLAGBXCN:
  269.             break;
  270.           case FLAGBXHM:
  271.             frm_eflag(flagtree, FLAGBXHM, "Ouch!");
  272.             selection = NO_OBJECT;
  273.             break;
  274.           case FLAGBXOK:
  275.             if (NO_OBJECT == obj_rbfind(flagtree, FLAGPBOD, SELECTED)) {
  276.                 frm_eflag(flagtree, FLAGPBOD, mustsel_od_msg);
  277.                 selection = NO_OBJECT;
  278.             } else if (0 == obj_bmbuttons(flagtree, FLAGPBIN, SELECTED, OBJ_BMINQUIRE)) {
  279.                 frm_eflag(flagtree, FLAGPBIN, mustsel_in_msg);
  280.                 selection = NO_OBJECT;
  281.             } else if (0 == *edittext) {
  282.                 frm_eflag(flagtree, FLAGTEIF, mustenter_fn_msg);
  283.                 selection = NO_OBJECT;
  284.             }
  285.             break;
  286.         }
  287.     } while (selection == NO_OBJECT);
  288.  
  289.     frm_dialog(FRM_DFINISH, flagtree, 0);
  290.  
  291. }
  292.  
  293. /*-------------------------------------------------------------------------
  294.  * demo_frm_progress - Demo the dynamic progress dialog.
  295.  *-----------------------------------------------------------------------*/
  296.  
  297. static void demo_frm_progress()
  298. {
  299.     int tracks;
  300.     int counter;
  301.     tracks = 80;
  302.  
  303.     frm_progress(FRM_PSTART, tracks, "Abort", progress_msg, tracks);
  304.  
  305.     for (counter = 0; counter < tracks; ++counter) {
  306.         if (frm_progress(FRM_PUPDATE, 0, NULL, track_msg, counter, 0)) {
  307.             break;
  308.         }
  309.         evnx_timer(100L);
  310.         if (frm_progress(FRM_PUPDATE, 0, NULL, track_msg, counter, 1)) {
  311.             break;
  312.         }
  313.         evnx_timer(100L);
  314.         if (frm_progress(FRM_PUPDATE, OBJ_TINCREMENT, NULL, NULL)) {
  315.             break;
  316.         }
  317.     }
  318.  
  319.     frm_qtext("\x7F" "All done");
  320.  
  321.     frm_progress(FRM_PFINISH, 0, NULL, NULL);
  322. }
  323.  
  324. /*-------------------------------------------------------------------------
  325.  *
  326.  *-----------------------------------------------------------------------*/
  327.  
  328. static void drag_icon(ptree, object)
  329.     OBJECT *ptree;
  330.     int object;
  331. {
  332.     GRECT old_rect;
  333.     GRECT new_rect;
  334.  
  335.     obj_clcalc(ptree, object, &old_rect, NULL);
  336.     rc_copy(&old_rect, &new_rect);
  337.  
  338.     grfx_dragbox(&new_rect, &gl_rwdesk, &new_rect);
  339.     ptree[object].ob_x = new_rect.g_x - ptree->ob_x;
  340.     ptree[object].ob_y = new_rect.g_y - ptree->ob_y;
  341.  
  342.     frmx_dial(FMD_FINISH, NULL, &old_rect);
  343.     frmx_dial(FMD_FINISH, NULL, &new_rect);
  344.     evnx_timer(0L);
  345. }
  346.  
  347. /*-------------------------------------------------------------------------
  348.  * demo_frm_desktop - Demo the handling of an installed desktop.
  349.  *-----------------------------------------------------------------------*/
  350.  
  351. static void demo_frm_desktop()
  352. {
  353.     int     obj;
  354.     int     oldmouse;
  355.     int     exit_requested  = FALSE;
  356.     int     selected_object = NO_OBJECT;
  357.     XMULTI  xm;
  358.     char    dummy_path[128];
  359.  
  360.     xm.mflags   = MU_MESAG | MU_BUTTON;
  361.     xm.mbclicks = 2;
  362.     xm.mbmask   = 1;
  363.     xm.mbstate  = 1;
  364.  
  365.     oldmouse = graf_mouse(ARROW, NULL);
  366.     frm_desktop(FRM_DTINSTALL|FRM_CENTER, desktree);
  367.  
  368.     do  {
  369.         evnx_multi(&xm);
  370.  
  371.         if ((xm.mwhich & MU_MESAG) && xm.msgbuf[0] == MN_SELECTED) {
  372.             switch (xm.msgbuf[4]) {
  373.               case MENDINFO:
  374.                 frm_qtext(version_msg);
  375.                 break;
  376.               case MENFFSEL:
  377.                 fsl_dialog(FSL_NORMAL, dummy_path, NULL, NULL, "Dummy File Selector");
  378.                 break;
  379.               case MENFQUIT:
  380.                 exit_requested = TRUE;
  381.                 break;
  382.             }
  383.             menu_tnormal(menutree, xm.msgbuf[3], TRUE);
  384.         }
  385.  
  386.         if (xm.mwhich & MU_BUTTON) {
  387.             if (selected_object != NO_OBJECT) {
  388.                 obj_stchange(desktree, selected_object, ~SELECTED, TRUE);
  389.             }
  390.             obj = objc_find(desktree, ROOT, MAX_DEPTH, xm.mmox, xm.mmoy);
  391.             if (obj != NO_OBJECT && desktree[obj].ob_type == G_ICON) {
  392.                 obj_stchange(desktree, obj, SELECTED, TRUE);
  393.                 selected_object = obj;
  394.                 if (xm.mbreturn == 2) {
  395.                     frm_qtext("You double-clicked an icon");
  396.                 } else {
  397.                     drag_icon(desktree, obj);
  398.                 }
  399.             }
  400.         }
  401.  
  402.     } while (!exit_requested);
  403.  
  404.  
  405.     frm_desktop(FRM_DTREMOVE, NULL);
  406.     graf_mouse(oldmouse, NULL);
  407. }
  408.  
  409.  
  410. /*-------------------------------------------------------------------------
  411.  * change_defaults - Change the default dialog handling options.
  412.  *-----------------------------------------------------------------------*/
  413.  
  414. static void change_defaults()
  415. {
  416.     int  basic_options;
  417.     int  dynamic_options;
  418.     long default_options;
  419.  
  420.     default_options = frm_defaults(FRM_GETDEFAULTS);
  421.     basic_options   = (short)(default_options & FRM_BOPTIONBITS);
  422.     dynamic_options = (short)((default_options & FRM_DOPTIONBITS) >> 16);
  423.  
  424.     obj_bmbuttons(defltree, DEFLPBB1, SELECTED, basic_options);
  425.     obj_bmbuttons(defltree, DEFLPBD1, SELECTED, dynamic_options);
  426.  
  427.     frm_dialog(FRM_NORMAL, defltree, 0);
  428.  
  429.     basic_options   = obj_bmbuttons(defltree, DEFLPBB1, SELECTED, OBJ_BMINQUIRE);
  430.     dynamic_options = obj_bmbuttons(defltree, DEFLPBD1, SELECTED, OBJ_BMINQUIRE);
  431.  
  432.     default_options = ((long)dynamic_options << 16) | basic_options;
  433.     frm_defaults(default_options);
  434. }
  435.  
  436. /*-------------------------------------------------------------------------
  437.  * main - Yer typical main driver routine.
  438.  *-----------------------------------------------------------------------*/
  439.  
  440. int main()
  441. {
  442.     int selection;
  443.  
  444.     prg_init();
  445.     mnu_tbar(menu_title_string);
  446.  
  447.     do  {
  448.         selection = frm_menu(FRM_DMUSTSELECT, maintree, SELECTED);
  449.         maintree[selection].ob_state &= ~SELECTED;
  450.         switch (selection) {
  451.  
  452.           case MAINBXEX:
  453.             /* exit -- do nothing */
  454.             break;
  455.  
  456.           case MAINBXCD:
  457.             change_defaults();
  458.             break;
  459.  
  460.           case FRMDESKT:
  461.             menu_bar(menutree, TRUE);
  462.             demo_frm_desktop();
  463.             mnu_tbar(menu_title_string);
  464.             break;
  465.  
  466.           case FRMEFLAG:
  467.             demo_frm_eflag();
  468.             break;
  469.  
  470.           case FRMPROGR:
  471.             demo_frm_progress();
  472.             break;
  473.  
  474.           case FRMMKMOV:
  475.             frm_dialog(FRM_USEBLIT, movetree, 0);
  476.             break;
  477.  
  478.           case RSCCUBUT:
  479.             frm_dialog(FRM_NORMAL, cbtntree, 0);
  480.             break;
  481.  
  482.           case RSCRRBUT:
  483.             frm_dialog(FRM_NORMAL, rbtntree, 0);
  484.             break;
  485.  
  486.           case OBJTSCRL:
  487.             frm_dialog(FRM_NORMAL, scrltree, 0);
  488.             break;
  489.  
  490.           case OBJNSLID:
  491.             frm_dialog(FRM_NORMAL, nslitree, 0);
  492.             break;
  493.  
  494.           case FRMQTEXT:
  495.             frm_qtext(qtext_msg, rand(), rand(), rand(), rand());
  496.             break;
  497.  
  498.           case FRMQERRO:
  499.             frm_qerror(Err_demo, "\x7F" "Demo of frm_qerror()\n\n");
  500.             break;
  501.  
  502.           case FRMQUEST:
  503.             frm_question("\nDo you like the demo so far?\n\n");
  504.             break;
  505.  
  506.           case FRMQCHOI:
  507.             frm_qchoice(qchoice_buttons, qchoice_msg);
  508.             break;
  509.  
  510.           case FRMQMENU:
  511.             frm_qmenu(qmenu_title, qmenu_items);
  512.             break;
  513.  
  514.           default:
  515.             frm_qerror(Err_unknown,
  516.                         "Impossible: unknown case in main switch()...\n"
  517.                         "\x7F" "Exit button value was %d\n",
  518.                         selection);
  519.             break;
  520.         }
  521.     } while (selection != MAINBXEX);
  522.  
  523.     prg_exit();
  524.     return 0;
  525. }
  526.  
  527.  
  528.